
freeslot(
	"MT_CRYSTAL",
	"SPR_S500",
	"SPR_CRYS",
	"S_CRYS1",
	"S_CRYS2",
	"S_CRYS3",
	"S_CRYS4",
	"S_CRYS5",
	"S_CRYS6",
	"S_CRYS7",
	"MT_DRSH",
	"S_DRSH",
	"MT_TKDR",
	"S_TKDR",
	"SPR_TKDR",
	"S_TKDR2",
	"S_TKDR3",
	"sfx_tkdr",
	"MT_GKEY",
	"SPR_GKEY",
	"S_GKEY",
	"S_GKEY2",
	"S_GKEY3",
	"MT_HINTTIPS",
	"MT_HINTTIPS2",
	"SPR_HELP",
	"S_HINT1",
	"S_HINT2",
	"S_HINT3",
	"S_HINT4",
	"S_HINT5",
	"MT_PULLRING",
	"SPR_PLRG",
	"S_PLRG1",
	"S_PLRG2",
	"S_PLRG3",
	"S_PLRG4",
	"S_PLRG5",
	"MT_GREENSPRING",
	"S_GSPR",
	"S_GSPR2",
	"S_GSPR3",
	"S_GSPR4",
	"S_GSPR5",
	"SPR_GSPR",
	"MT_FLYFILL",
	"SPR_FLYW",
	"S_FLYG_1",
	"S_FLYG_2",
	"S_FLYG_3",
	"MT_LOCKONTARGET",
	"S_LKTR",
	"S_LKTR2",
	"S_LKTR3",
	"MT_DECOR_15",
	"SPR_DECF",
	"S_DECOR_15A",
	"S_DECOR_15B",
	"S_DECOR_15C",
	"S_DECOR_15D",
	"S_DECOR_15E",
	"S_DECOR_15F",
	"MT_UNLOCK",
	"S_UNLK1",
	"S_UNLK2",
	"MT_UNLOCK2",
	"S_UNLK3",
	"S_UNLK4",
	"SPR_BTTN",
	"MT_MILKCUP",
	"SPR_MILK",
	"S_MILK1",
	"MT_ROCKPILLAR_SHORT",
	"MT_ROCKPILLAR_TALL",
	"SPR_RKPL",
	"S_ROCKPILLAR1",
	"S_ROCKPILLAR2"
)

-----------------------
mobjinfo[MT_TKDR] = {
	--$Name "Token Door"
	--$Sprite TKDRA0
	doomednum = 698,
	spawnstate = S_TKDR,
	deathstate = S_TKDR,
	reactiontime = TICRATE,
	radius = 64*FRACUNIT,
	height = 128*FRACUNIT,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY
}

states[S_TKDR] = {SPR_TKDR, FF_PAPERSPRITE|A, 1, A_None, 0, 0, S_TKDR}
states[S_TKDR2] = {SPR_TKDR, FF_PAPERSPRITE|A, 1, A_None, 0, 0, S_TKDR3}
states[S_TKDR3] = {SPR_TKDR, FF_PAPERSPRITE|B, 12, A_None, 0, 0, S_NULL}

addHook("MobjThinker", function(mobj,player)
	if not (mobj and mobj.valid)
		return end	
	for player in players.iterate
		
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		
		if mobj.state > S_TKDR
			P_SpawnMobj(mobj.x + P_RandomRange(-64,64)*mobj.scale, mobj.y + P_RandomRange(-64,64)*mobj.scale, mobj.z + P_RandomRange(0,128)*mobj.scale, MT_IVSP)
		end
		
		if ((mobjrange <= 100*FRACUNIT and player.keynum > 2 and player.mo.z <= mobj.z + 256*FRACUNIT)
		or (player.keyopen == true ))
		
		and mobj.state == S_TKDR
			S_StartSound(player.mo, sfx_tkdr, player)
			S_StartSound(player.mo, 194, player)
			S_StartSound(player.mo, 195, player)
			P_SpawnGhostMobj(mobj)
			mobj.state = S_TKDR2
		end
		
	end
end,MT_TKDR
)


mobjinfo[MT_DRSH] = {
	--$Name "Token Door Barrier"
	--$Sprite TKDRB0
	doomednum = 699,
	spawnstate = S_DRSH,
	deathstate = S_DRSH,
	reactiontime = TICRATE,
	radius = 600*FRACUNIT,
	height = 256*FRACUNIT,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY
}

states[S_DRSH] = {SPR_NULL, A, 1, A_None, 0, 0, S_DRSH}

addHook("MobjThinker", function(mobj,player)
	if not (mobj and mobj.valid)
		return end	
	for player in players.iterate
		if mobj.tkdrstate == nil
			mobj.tkdrstate = 0
		end
		if player.keynum == nil
			player.keynum = 0
		end		
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		local mobjlook = R_PointToAngle2(mobj.x, mobj.y, player.mo.x, player.mo.y)
		local playerlook = R_PointToAngle2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		
		
		
		mobj.tkdrstate = 0
		if mobjrange <= 600*FRACUNIT		---if youre at a certain distance...
		and player.mo.keynum < 3
		and player.mo.z <= mobj.z + 256*FRACUNIT
			mobj.tkdrstate = 1
			
		end
		
		if mobj.tkdrstate == 1
			player.mo.angle = playerlook	---stare at the player
			P_InstaThrust(player.mo, player.mo.angle, -10*FRACUNIT)
		end
	end
end,MT_DRSH
)



mobjinfo[MT_CRYSTAL] = {
	--$Name "Collectible Crystal"
	--$Sprite CRYSA0
	doomednum = 663,
	spawnstate = S_CRYS1,
	reactiontime = 500,
	deathstate = S_CRYS7,
	deathsound = sfx_antiri,
	mass = 1000,
	damage = 1,
	speed = 0*FRACUNIT,
	radius = 24*FRACUNIT,
	height = 24*FRACUNIT,
	flags = MF_SPECIAL|MF_RUNSPAWNFUNC|MF_NOGRAVITY|MF_NOCLIP
}

states[S_CRYS1] = {SPR_CRYS, FF_FULLBRIGHT|FF_ANIMATE|A, 16, A_None, 8, 2, S_CRYS1}
states[S_CRYS7] = {SPR_NULL, FF_FULLBRIGHT|A, 1, A_AwardScore, 0, 0, S_CRYS2}
states[S_CRYS2] = {SPR_CRYS, FF_FULLBRIGHT|A, 1, A_SpawnObjectRelative, MT_SUPERSPARK, 0+(0*65536), S_CRYS3}
states[S_CRYS3] = {SPR_S500, FF_FULLBRIGHT|A, 5, A_BunnyHop, 2, 0, S_CRYS4}
states[S_CRYS4] = {SPR_S500, FF_FULLBRIGHT|A, 5, A_BunnyHop, 1, 0, S_CRYS5}
states[S_CRYS5] = {SPR_S500, FF_FULLBRIGHT|A, 5, A_BunnyHop, 0, 0, S_CRYS6}
states[S_CRYS6] = {SPR_S500, FF_FULLBRIGHT|A, 15, A_None, 0, 0, S_NULL}



mobjinfo[MT_GKEY] = {
	--$Name "Blue Key"
	--$Sprite GKEYA0
	doomednum = 789,
	spawnstate = S_GKEY,
	seestate = S_GKEY,
	deathstate = S_GKEY2,
	radius = 48*FRACUNIT,
	height = 80*FRACUNIT,
	flags = MF_SPECIAL|MF_RUNSPAWNFUNC|MF_NOGRAVITY|MF_NOCLIP
}

states[S_GKEY] = {SPR_GKEY,  FF_ANIMATE|A, 32, A_None, 16, 2, S_GKEY}
states[S_GKEY2] = {SPR_GKEY, Q , 1, A_None, 0, 0, S_GKEY3}
states[S_GKEY3] = {SPR_GKEY, Q , 1, A_None, 0, 0, S_NULL}


addHook("MapLoad", do
	for player in players.iterate
		player.keynum = 0
		player.keynummp = 0
		player.keynumglobal = 0
		player.keyopen = false
		player.leveleffects = false
		if gamemap != 779 --showmap
		and gamemap != 778 --showmap
		return end
		CONS_Printf(player, "\130** \128Use '\129effects on' \128in Console to enable level special effects.")
		CONS_Printf(player, "\130** \128Use '\129effects off' \128in Console to change it back if your game performance is affected.")
		
	end
end
)
COM_AddCommand("effects", function(player,command)
	if gamemap != 778 --showmap
	and gamemap != 779 --showmap
	return end
	if player.leveleffects == nil	
	or (player.leveleffects == true
	and command == "off")
		player.leveleffects = false
		CONS_Printf(player, "Level special effects are now\136 OFF.")
		end
	
	if player.leveleffects == false
	and command == "on"
		player.leveleffects = true
		CONS_Printf(player, "Level special effects are now \135 ON.")
	end
end
)

--multiplayer fix
local function HippoThink(p)
	if p.haskeys == nil
		p.haskeys = 0
	end		
	p.keynum = p.player.keynum	
	

end
addHook("MobjThinker", HippoThink, MT_PLAYER)
---
local tab = "cecho \\\\\\\\\\\\\\\\\\\\\\ "

addHook("MobjThinker", function(mobj,player)
	for player in players.iterate

		
		if player.keynum == nil
			player.keynum = 0
		end
		if player.keynummp == nil
			player.keynummp = 0
		end
		if player.keynumglobal == nil
			player.keynumglobal = 0
		end

		if mobj.state == S_GKEY2
		and splitscreen == true
			player.keynummp = $ + 1
			
		end
		
		player.keynumglobal = player.keynum + player.keynummp

		
		if (multiplayer == true
		or splitscreen == true)
		and player.keynumglobal > 2
			player.keyopen = true
		end
	

			if mobj.state == S_GKEY2
				P_SpawnGhostMobj(mobj)
				player.keynum = $ + 1
				S_StartSound(player.mo, 192, player)
				S_StartSound(player.mo, 188, player)
				P_SpawnMobj(mobj.x,mobj.y,mobj.z+64*FRACUNIT,MT_SUPERSPARK)
				P_SpawnMobj(mobj.x,mobj.y,mobj.z+64*FRACUNIT,MT_IVSP)				
			
		end
	end
end,MT_GKEY
)

addHook("PreThinkFrame", do
	for player in players.iterate
		if player.split == nil
			player.split = false
		end
		player.split = splitscreen
	end
end
)


local function Keytext(v, player)
	if gamemap != 778 --showmap
	and gamemap != 779 --showmap
	return end
	if player.split == true
		v.drawString(24, 30,"KEYS    "+ player.keynumglobal,V_HUDTRANS|V_SNAPTOLEFT|V_SNAPTOBOTTOM,"thin-center")
		v.drawString(28, 32,"x",V_YELLOWMAP|V_HUDTRANS|V_SNAPTOLEFT|V_SNAPTOBOTTOM,"small-thin-center")
		v.drawString(24, 180,"KEYS    "+ player.keynumglobal,V_HUDTRANS|V_SNAPTOLEFT|V_SNAPTOBOTTOM,"thin-center")
		v.drawString(28, 182,"x",V_YELLOWMAP|V_HUDTRANS|V_SNAPTOLEFT|V_SNAPTOBOTTOM,"small-thin-center")
	return end
	v.drawString(48, 165,"KEYS    "+ player.keynum,V_HUDTRANS|V_SNAPTOLEFT|V_SNAPTOBOTTOM,"center")
	v.drawString(60, 167,"x",V_YELLOWMAP|V_HUDTRANS|V_SNAPTOLEFT|V_SNAPTOBOTTOM,"small-center")
end
hud.add(Keytext)

mobjinfo[MT_HINTTIPS] = {
	--$Name "Hint Bubble"
	--$Sprite HELPA0
	doomednum = 957,
	spawnstate = S_HINT1,
	seestate = S_HINT1,
	deathstate = S_HINT2,
	flags = MF_NOGRAVITY|MF_SPECIAL
}

states[S_HINT1] = {SPR_HELP, FF_FULLBRIGHT|A, 1, A_None, 0, 0, S_HINT1}
states[S_HINT2] = {SPR_HELP, FF_FULLBRIGHT|A, 1, A_None, 0, 0, S_HINT4}
states[S_HINT4] = {SPR_HELP, FF_FULLBRIGHT|A, 360, A_None, 0, 0, S_HINT5}
states[S_HINT5] = {SPR_HELP, FF_FULLBRIGHT|A, 1, A_SpawnFreshCopy, 0, 0, S_NULL}


mobjinfo[MT_HINTTIPS2] = {
	doomednum = -1,
	spawnstate = S_HINT3,
	seestate = S_HINT3,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY|MF_NOCLIP
}
states[S_HINT3] = {SPR_HELP,  FF_FULLBRIGHT|FF_PAPERSPRITE|B, 71, A_None, 0, 0, S_NULL}

addHook("MobjThinker", function(mobj)
	if not (mobj and mobj.valid)
		return end	
	if multiplayer == true
		P_KillMobj(mobj)
	return end
	mobj.angle = $ + ANG1*5
end,MT_HINTTIPS2
)

--HINTS CAN CHANGE DEPENDING ON THE MOBJ ANGLE

addHook("MobjThinker", function(mobj,player)
	for player in players.iterate
	
		if not (mobj and mobj.valid)
		return end	
		
		mobj.scale = 2*FRACUNIT/3
		local getangle = mobj.angle/(59500*200)
		
		if multiplayer == true
			P_KillMobj(mobj)
		return end
		
		P_LinedefExecute(getangle, player.mo)
		
		if mobj.hinttics == nil
			mobj.hinttics = 0
		end
		
		mobj.hinttics = $ + 1
		
		if mobj.hinttics == 71
			mobj.hinttics = 0
			P_SpawnMobj(mobj.x, mobj.y, mobj.z+64*FRACUNIT, MT_HINTTIPS2)	
		end


	end
end,MT_HINTTIPS
)



mobjinfo[MT_PULLRING] = {
	--$Name "Pull Ring"
	--$Sprite PLRGA0
	doomednum = 2999,
	spawnstate = S_PLRG1,
	reactiontime = 500,
	deathstate = S_PLRG3,
	deathsound = sfx_antiri,
	mass = 1000,
	damage = 1,
	speed = 32*FRACUNIT,
	radius = 24*FRACUNIT,
	height = 24*FRACUNIT,
	flags = MF_SPECIAL|MF_RUNSPAWNFUNC|MF_NOGRAVITY|MF_NOCLIP|MF_NOCLIPHEIGHT
}

states[S_PLRG1] = {SPR_PLRG, FF_FULLBRIGHT|A, 1, A_SetScale, 2*FRACUNIT, 0, S_PLRG2}
states[S_PLRG2] = {SPR_PLRG, FF_FULLBRIGHT|FF_ANIMATE|A, 24, A_None, 24, 1, S_PLRG2}
states[S_PLRG3] = {SPR_NULL, FF_FULLBRIGHT|A, 1, A_SpawnObjectRelative, MT_SUPERSPARK, 0+(0*65536), S_PLRG4}
states[S_PLRG4] = {SPR_NULL, FF_FULLBRIGHT|A, 16, A_None, 0, 0, S_PLRG5}
states[S_PLRG5] = {SPR_NULL, FF_FULLBRIGHT|A, 1, A_None, 0, 0, S_NULL}



addHook("MobjThinker", function(mobj,player)
	for player in players.iterate
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)

		
		--COM_BufInsertText(player,"cecho "+mobj.cusval)
		if player.mo.z <= mobj.z + mobj.height*2
		and player.mo.z >= mobj.z - mobj.height*2
		and mobjrange <= mobj.radius*2		---if youre at a certain distance...
		and mobj.state >= S_PLRG3
			P_SpawnGhostMobj(mobj)
			
			if mobj.state == S_PLRG3
				mobj.cusval = player.powers[pw_shield]
				S_StartSound(player.mo, 192, player)
				S_StartSound(player.mo, 188, player)
				
				
			end
			if mobj.state == S_PLRG4
				player.powers[pw_shield] = $|SH_ATTRACT
				P_SetOrigin(mobj, player.mo.x, player.mo.y, player.mo.z)
			end
			if mobj.state == S_PLRG5
				if player.powers[pw_invulnerability] < 2
					player.powers[pw_invulnerability] = 1
				end
				player.powers[pw_shield] = ~SH_ATTRACT
				player.powers[pw_shield] = mobj.cusval --it works just wont spawn the actual shield graphics

			end
		end
	end
end,MT_PULLRING
)

--cloud fog smoke --object 697
mobjinfo[MT_DECOR_15] = {
	doomednum = -1,
	spawnstate = S_DECOR_15A,
	seestate = S_DECOR_15A,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_DECOR_15A] = {SPR_DECF, FF_TRANS90|A, 8, A_BunnyHop, 0, 0, S_DECOR_15B}
states[S_DECOR_15B] = {SPR_DECF, FF_TRANS80|A, 8, A_BunnyHop, 0, 0, S_DECOR_15C}
states[S_DECOR_15C] = {SPR_DECF, FF_TRANS70|A, 8, A_BunnyHop, 0, 0, S_DECOR_15D}
states[S_DECOR_15D] = {SPR_DECF, FF_TRANS70|A, 8, A_BunnyHop, 0, 0, S_DECOR_15E}
states[S_DECOR_15E] = {SPR_DECF, FF_TRANS80|A, 8, A_BunnyHop, 0, 0, S_DECOR_15F}
states[S_DECOR_15F] = {SPR_DECF, FF_TRANS90|A, 8, A_BunnyHop, 0, 0, S_NULL}

addHook("MobjThinker", function(mobj)
	if mobj.state < S_DECOR_15F
		mobj.destscale = 4*FRACUNIT
		mobj.scalespeed = 1*FRACUNIT/100
	end
end,MT_DECOR_15
)


mobjinfo[MT_LOCKONTARGET] = {
	--$Name "Lock On Target Base"
	--$Sprite LCKNA0
	doomednum = 2842,
	spawnstate = S_LKTR,
	reactiontime = 500,
	deathstate = S_LKTR2,
	deathsound = sfx_antiri,
	mass = 1000,
	damage = 1,
	speed = 0*FRACUNIT,
	radius = 24*FRACUNIT,
	height = 24*FRACUNIT,
	flags = MF_SPECIAL|MF_SHOOTABLE|MF_MONITOR
}

states[S_LKTR] = {SPR_NULL, A, 1, A_None, 1, 1, S_LKTR}
states[S_LKTR2] = {SPR_NULL, A, 18, A_None, 1, 1, S_LKTR3}
states[S_LKTR3] = {SPR_NULL, A, 1, A_SpawnFreshCopy, 1, 1, S_NULL}



mobjinfo[MT_GREENSPRING] = {
	--$Name "Green Diagonal Spring"
	--$Sprite GSPRA1
	doomednum = 793,
	spawnstate = S_GSPR,
	seestate = S_GSPR,
	reactiontime = TICRATE,
	speed = 0*FRACUNIT,
	radius = 32*FRACUNIT,
	height = 2*FRACUNIT,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY|MF_SPRING
}

states[S_GSPR] = {SPR_GSPR,  A, 1, A_None, 0, 0, S_GSPR}
addHook("MobjThinker", function(mobj,player)
	for player in players.iterate
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		

		if player.mo.z <= mobj.z + 32*FRACUNIT
		and player.mo.z >= mobj.z - 32*FRACUNIT
		and mobjrange <= 32*FRACUNIT		---if youre at a certain distance...
			player.mo.angle = mobj.angle
			P_InstaThrust(player.mo, mobj.angle, 50*FRACUNIT)
			P_SetObjectMomZ(player.mo,25*FRACUNIT, nil)
			player.powers[pw_justsprung] = 1
			player.mo.state = S_PLAY_SPRING
			P_ResetPlayer(player)
			mobj.state = S_GSPR
			S_StartSound(player.mo, 288, player)
		end
	end
end,MT_GREENSPRING
)




mobjinfo[MT_FLYFILL] = {
	--$Name "Restore Flight Time"
	--$Sprite FLYWA0
	doomednum = 664,
	spawnstate = S_FLYG_1,
	reactiontime = 500,
	deathstate = S_FLYG_2,
	deathsound = sfx_s3k6B,
	painstate = S_FLYG_2,
	painsound = sfx_s3k6B,
	mass = 1000,
	damage = 1,
	speed = 0*FRACUNIT,
	radius = 32*FRACUNIT,
	height = 32*FRACUNIT,
	flags = MF_SPECIAL|MF_NOGRAVITY|MF_NOCLIP
}

states[S_FLYG_1] = {SPR_FLYW, FF_FULLBRIGHT|A, 2, A_None, 0, 0, S_FLYG_1}
states[S_FLYG_2] = {SPR_FLYW, FF_FULLBRIGHT|A, 1, A_CustomPower, pw_tailsfly, 8*TICRATE, S_FLYG_3}
states[S_FLYG_3] = {SPR_FLYW, FF_FULLBRIGHT|A, 1, A_SpawnObjectRelative, 0, (0*65536)+MT_IVSP, S_NULL}



mobjinfo[MT_UNLOCK] = {
	--$Name "Button Switch"
	--$Sprite BTTNA0
	doomednum = 796,
	spawnstate = S_UNLK1,
	seestate = S_UNLK1,
	reactiontime = TICRATE,
	speed = 0*FRACUNIT,
	radius = 64*FRACUNIT,
	height = 2*FRACUNIT,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY
}

states[S_UNLK1] = {SPR_BTTN,  FF_PAPERSPRITE|FF_FULLBRIGHT|A, 1, A_None, 0, 0, S_UNLK1}
states[S_UNLK2] = {SPR_BTTN,  FF_PAPERSPRITE|FF_FULLBRIGHT|B, 1, A_None, 0, 0, S_UNLK2}

addHook("MobjThinker", function(mobj,player)
	for player in players.iterate
	
		
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		local getangle = mobj.angle/(59500*200)
		
		mobj.renderflags =  $|RF_FLOORSPRITE|RF_NOSPLATBILLBOARD
		
		if player.mo.z <= mobj.z
		and mobjrange <= 64*FRACUNIT		---if youre at a certain distance...
		and mobj.state == S_UNLK1
			P_LinedefExecute(getangle, player.mo)
			mobj.state = S_UNLK2
			S_StartSound(player.mo, 319, player)	
			S_StartSound(player.mo, 192, player)	
		end
	end
end,MT_UNLOCK
)


mobjinfo[MT_UNLOCK2] = {
	--$Name "Button Switch (Holdable)"
	--$Sprite BTTNB0
	doomednum = 795,
	spawnstate = S_UNLK3,
	seestate = S_UNLK3,
	reactiontime = TICRATE,
	speed = 0*FRACUNIT,
	radius = 64*FRACUNIT,
	height = 2*FRACUNIT,
	flags = MF_NOBLOCKMAP|MF_NOGRAVITY
}

states[S_UNLK3] = {SPR_BTTN,  FF_PAPERSPRITE|FF_FULLBRIGHT|A, 1, A_None, 0, 0, S_UNLK3}
states[S_UNLK4] = {SPR_BTTN,  FF_PAPERSPRITE|FF_FULLBRIGHT|B, 1, A_None, 0, 0, S_UNLK4}

addHook("MobjThinker", function(mobj,player)
	for player in players.iterate
	
		
		local mobjrange = R_PointToDist2(player.mo.x, player.mo.y, mobj.x, mobj.y)
		local getangle = mobj.angle/(59500*200)
		
		mobj.renderflags =  $|RF_FLOORSPRITE|RF_NOSPLATBILLBOARD
		
		P_SetObjectMomZ(mobj,0*FRACUNIT, nil)
		if player.mo.z >= mobj.z
		and mobjrange > 64*FRACUNIT		---if youre at a certain distance...
		and mobj.state == S_UNLK4
			mobj.state = S_UNLK3
		end
		if player.mo.z <= mobj.z
		and mobjrange <= 64*FRACUNIT		---if youre at a certain distance...
			P_LinedefExecute(getangle, player.mo)
			if mobj.state == S_UNLK3
				S_StartSound(player.mo, 319, player)				
				mobj.state = S_UNLK4
			end
		end
	end
end,MT_UNLOCK2
)

mobjinfo[MT_MILKCUP] = {
	--$Name "Cup of Milk"
	--$Sprite MILKA0
	doomednum = 2880,
	spawnstate = S_MILK1,
	seestate = S_MILK1,
	flags = MF_NOGRAVITY|MF_NOCLIP|MF_NOBLOCKMAP|MF_NOCLIPTHING|MF_NOCLIPHEIGHT|MF_SCENERY|MF_SPECIAL
}

states[S_MILK1] = {SPR_MILK, A, 1, A_None, 0, 0, S_MILK1}





mobjinfo[MT_ROCKPILLAR_SHORT] = {
	--$Name "Rock Pillar (Short)"
	--$Sprite RKPLA0
	doomednum = 3308,
	spawnstate = S_ROCKPILLAR1,
	radius = 16*FRACUNIT,
	height = 256*FRACUNIT,
	flags = MF_NOGRAVITY|MF_SOLID|MF_NOTHINK|MF_SCENERY
}
states[S_ROCKPILLAR1] = {SPR_RKPL, A, 1, A_None, 0, 0, S_ROCKPILLAR1}

mobjinfo[MT_ROCKPILLAR_TALL] = {
	--$Name "Rock Pillar (Tall)"
	--$Sprite RKPLB0
	doomednum = 3307,
	spawnstate = S_ROCKPILLAR2,
	radius = 48*FRACUNIT,
	height = 512*FRACUNIT,
	flags = MF_NOGRAVITY|MF_SOLID|MF_NOTHINK|MF_SCENERY
}
states[S_ROCKPILLAR2] = {SPR_RKPL, B, 1, A_None, 0, 0, S_ROCKPILLAR2}
